Skip to main content

Q-4: LinearLayout vs RelativeLayout OR Context Menu Implementation (5 Marks)

Questions​

i) Design a user interface using LinearLayout and RelativeLayout. Explain the difference between them.

ii) Implement a context menu in an Android application and demonstrate its functionality.


Answers​

i) LinearLayout vs RelativeLayout Design and Differences​

LinearLayout Design Example​

<!-- LinearLayout Example: Vertical Login Form -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
android:gravity="center">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Login Form"
android:textSize="24sp"
android:textStyle="bold"
android:layout_marginBottom="32dp" />

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Username"
android:layout_marginBottom="16dp" />

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Password"
android:inputType="textPassword"
android:layout_marginBottom="24dp" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center">

<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Login"
android:layout_marginEnd="8dp" />

<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Cancel"
android:layout_marginStart="8dp" />
</LinearLayout>
</LinearLayout>

RelativeLayout Design Example​

<!-- RelativeLayout Example: Profile Layout -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">

<ImageView
android:id="@+id/profileImage"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true"
android:src="@drawable/ic_profile"
android:layout_marginTop="32dp" />

<TextView
android:id="@+id/nameText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/profileImage"
android:layout_centerHorizontal="true"
android:text="John Doe"
android:textSize="20sp"
android:textStyle="bold"
android:layout_marginTop="16dp" />

<TextView
android:id="@+id/emailText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/nameText"
android:layout_centerHorizontal="true"
android:text="john@example.com"
android:layout_marginTop="8dp" />

<Button
android:id="@+id/editButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/emailText"
android:layout_alignParentStart="true"
android:text="Edit Profile"
android:layout_marginTop="32dp" />

<Button
android:id="@+id/logoutButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/emailText"
android:layout_alignParentEnd="true"
android:text="Logout"
android:layout_marginTop="32dp" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="Version 1.0"
android:textSize="12sp"
android:layout_marginBottom="16dp" />
</RelativeLayout>

Key Differences​

AspectLinearLayoutRelativeLayout
OrganizationSequential (linear) arrangementRelative positioning to other views
OrientationHorizontal or VerticalNo specific orientation
PositioningBased on order in XMLBased on relationship rules
FlexibilityLimited positioning optionsHighly flexible positioning
PerformanceBetter performanceSlower due to multiple measurement passes
NestingOften requires nesting for complex layoutsCan achieve complex layouts without nesting
Use CaseSimple, sequential layoutsComplex, overlapping layouts

Positioning Attributes​

LinearLayout:

  • android:orientation: vertical/horizontal
  • android:layout_weight: distribute space proportionally
  • android:gravity: align children within the layout
  • android:layout_gravity: align view within parent

RelativeLayout:

  • android:layout_above: position above another view
  • android:layout_below: position below another view
  • android:layout_toLeftOf: position to left of another view
  • android:layout_toRightOf: position to right of another view
  • android:layout_alignParentTop: align to parent's top
  • android:layout_centerInParent: center in parent

ii) Context Menu Implementation​

Step 1: Register View for Context Menu​

public class MainActivity extends AppCompatActivity {
private ListView listView;
private ArrayAdapter<String> adapter;
private List<String> items;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

listView = findViewById(R.id.listView);
items = new ArrayList<>();
items.add("Item 1");
items.add("Item 2");
items.add("Item 3");

adapter = new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, items);
listView.setAdapter(adapter);

// Register for context menu
registerForContextMenu(listView);
}
}

Step 2: Create Context Menu​

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);

// Inflate menu from XML
getMenuInflater().inflate(R.menu.context_menu, menu);

// Or create programmatically
menu.setHeaderTitle("Select Action");
menu.add(0, 1, 0, "Edit");
menu.add(0, 2, 0, "Delete");
menu.add(0, 3, 0, "Share");
}

Step 3: Create Menu Resource File​

res/menu/context_menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_edit"
android:title="Edit" />
<item
android:id="@+id/menu_delete"
android:title="Delete" />
<item
android:id="@+id/menu_share"
android:title="Share" />
<item
android:id="@+id/menu_copy"
android:title="Copy" />
</menu>

Step 4: Handle Menu Item Selection​

@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info =
(AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int position = info.position;
String selectedItem = items.get(position);

switch (item.getItemId()) {
case R.id.menu_edit:
editItem(position, selectedItem);
return true;

case R.id.menu_delete:
deleteItem(position);
return true;

case R.id.menu_share:
shareItem(selectedItem);
return true;

case R.id.menu_copy:
copyItem(selectedItem);
return true;

default:
return super.onContextItemSelected(item);
}
}

Step 5: Implement Action Methods​

private void editItem(int position, String item) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Edit Item");

final EditText input = new EditText(this);
input.setText(item);
builder.setView(input);

builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String newText = input.getText().toString();
items.set(position, newText);
adapter.notifyDataSetChanged();
}
});

builder.setNegativeButton("Cancel", null);
builder.show();
}

private void deleteItem(int position) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Delete Item")
.setMessage("Are you sure you want to delete this item?")
.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
items.remove(position);
adapter.notifyDataSetChanged();
}
})
.setNegativeButton("Cancel", null)
.show();
}

private void shareItem(String item) {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, item);
startActivity(Intent.createChooser(shareIntent, "Share via"));
}

private void copyItem(String item) {
ClipboardManager clipboard = (ClipboardManager)
getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Copied Item", item);
clipboard.setPrimaryClip(clip);

Toast.makeText(this, "Item copied to clipboard", Toast.LENGTH_SHORT).show();
}

Alternative: Floating Context Menu​

// For floating context menu (older approach)
public void showContextMenu(View view) {
PopupMenu popup = new PopupMenu(this, view);
popup.getMenuInflater().inflate(R.menu.context_menu, popup.getMenu());

popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// Handle menu item clicks
return true;
}
});

popup.show();
}

Benefits of Context Menus​

  • Space Efficiency: Don't take permanent screen space
  • Contextual Actions: Actions relevant to selected item
  • User Experience: Familiar interaction pattern
  • Accessibility: Support for different interaction methods